package core;

/**
 * Type énuméré utilisé pour la direction sur l'échiquier
 * @author julien
 *
 */
public enum Cardinalite {
	Nord,
	NordEst,
	Est,
	SudEst,
	Sud,
	SudOuest,
	Ouest,
	NordOuest;
	
	/**
	 * Donne les cardinalité diagonales seulement
	 * @return cardinalités diagonales
	 */
	public static Cardinalite[] getCardinalitesDiagonales() {
		Cardinalite[] diagonales = {Cardinalite.NordEst, Cardinalite.SudEst, Cardinalite.SudOuest, Cardinalite.NordOuest};
		
		return diagonales;
	}
	
	/**
	 * Donne les cardinalité longitudinales seulement
	 * @return cardinalités longitudinales
	 */
	public static Cardinalite[] getCardinalitesLongitudinales() {
		Cardinalite[] longitudinales = {Cardinalite.Nord, Cardinalite.Est, Cardinalite.Sud, Cardinalite.Ouest};
		
		return longitudinales;
	}

	/**
	 * Donne la cardinalité opposée à celle donnée
	 * @param c
	 * @return
	 */
	public static Cardinalite getOpposite(Cardinalite c) {
		return getCardinalite(((getCode(c)+4)%8)+1);
	}
	
	/**
	 * Donne les cardinalités perpendiculaires à celle donnée
	 * @param c
	 * @return
	 */
	public static Cardinalite[] getPerpendiculars(Cardinalite c) {
		Cardinalite[] perpendiculars = {Cardinalite.getCardinalite(((Cardinalite.getCode(c)+1)%8)+1), Cardinalite.getCardinalite(((Cardinalite.getCode(c)+5)%8)+1)};
		
		return perpendiculars;
	}
	
	/**
	 * Donne le code entier de la cardinalité donnée
	 * @param c
	 * @return
	 */
	public static int getCode(Cardinalite c) {
		if (c == Cardinalite.Nord) {
			return 1;
		} else if (c == Cardinalite.NordEst) {
			return 2;
		} else if (c == Cardinalite.Est) {
			return 3;
		} else if (c == Cardinalite.SudEst) {
			return 4;
		} else if (c == Cardinalite.Sud) {
			return 5;
		} else if (c == Cardinalite.SudOuest) {
			return 6;
		} else if (c == Cardinalite.Ouest) {
			return 7;
		} else if (c == Cardinalite.NordOuest) {
			return 8;
		} else {
			return 0;
		}
	}
	
	/**
	 * Donne la cardinalité du code donné
	 * @param code
	 * @return
	 */
	public static Cardinalite getCardinalite(int code) {
		if (code == 1) {
			return Cardinalite.Nord;
		} else if (code == 2) {
			return Cardinalite.NordEst;
		} else if (code == 3) {
			return Cardinalite.Est;
		} else if (code == 4) {
			return Cardinalite.SudEst;
		} else if (code == 5) {
			return Cardinalite.Sud;
		} else if (code == 6) {
			return Cardinalite.SudOuest;
		} else if (code == 7) {
			return Cardinalite.Ouest;
		} else if (code == 8) {
			return Cardinalite.NordOuest;
		} else {
			return null;
		}
	}

	/**
	 * Fonction retournant la direction d'un pion en fonction de sa couleur
	 * @param couleur
	 * @return
	 */
	public static Cardinalite getDirectionPion(Couleur couleur) {
		if (couleur == null) {
			return null;
		} else if (couleur == Couleur.Blanc) {
			return Cardinalite.Nord;
		} else {
			return Cardinalite.Sud;
		}
	}

	/**
	 * Fonction retournant les cardinalités d'attaque d'un pion en fonction de sa couleur
	 * @param couleur
	 * @return
	 */
	public static Cardinalite[] getAttaquePion(Couleur couleur) {
		if (couleur != null && couleur == Couleur.Blanc) {
			Cardinalite[] attaques = {NordEst, NordOuest};
			return attaques;
		} else if (couleur != null && couleur == Couleur.Noir) {
			Cardinalite[] attaques = {SudEst, SudOuest};
			return attaques;
		} else {
			return null;
		}
	}
}
